package AdministradorConfiguracion;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Parser {

	private Map<Integer, Etapa> etapas;
	private Map<Integer, Lista> listas;

	public Parser(Map<Integer, Etapa> candidatos) {
		this.etapas = candidatos;
		listas = new HashMap<Integer, Lista>();
	}

	public void parsearEtapas(File archivoEtapas) throws FileNotFoundException {
		/*
		 * Asume que el archivo esta en el formato correcto
		 */
		Scanner parser = new Scanner(archivoEtapas);
		try {
			while (parser.hasNextLine()) {
				StringTokenizer tokenizer = new StringTokenizer(
						parser.nextLine());
				tokenizer.nextToken(); // Ignora la primer palabra
				Integer numero = Integer.parseInt(tokenizer.nextToken(":")
						.trim());
				String nombre = tokenizer.nextToken();
				etapas.put(numero, new Etapa(numero, nombre));
			}
		} catch (Exception e) {
			System.out
					.println("ERROR : Esta mal el formato del archivo de Etapas.");
		} finally {
			parser.close();
		}
	}

	public void parsearListas(File archivoListas) throws FileNotFoundException {
		/*
		 * Asume que el archivo esta en el formato correcto
		 */
		Scanner parser = new Scanner(archivoListas);
		try {
			while (parser.hasNextLine()) {
				StringTokenizer tokenizer = new StringTokenizer(
						parser.nextLine());
				tokenizer.nextToken(); // Ignora la primer palabra
				Integer numero = Integer.parseInt(tokenizer.nextToken(":")
						.trim());
				String nombre = tokenizer.nextToken().trim();
				listas.put(numero, new Lista(numero, nombre));
			}
		} catch (Exception e) {
			System.out
					.println("ERROR : Esta mal el formato del archivo de Listas.");
		} finally {
			parser.close();
		}
	}

	public void parsearCandidatos(File archivoCandidatos)
			throws FileNotFoundException {
		/*
		 * Asume que el archivo esta en el formato correcto
		 */
		Scanner parser = new Scanner(archivoCandidatos);
		try {
			while (parser.hasNextLine()) {
				for (int e = 0; e < etapas.size(); e++) {
					StringTokenizer tokenizer = new StringTokenizer(
							parser.nextLine());
					tokenizer.nextToken(); // Ignora el "Etapa"
					tokenizer.nextToken(); // Ignora el "="
					Integer numeroEtapa = Integer.parseInt(tokenizer
							.nextToken().trim());

					Etapa etapaActual = etapas.get(numeroEtapa);
					String linea = new String();
					while (!(linea = parser.nextLine().trim())
							.equals("FIN_ETAPA")) {
						tokenizer = new StringTokenizer(linea);
						tokenizer.nextToken(); // Ignora el "Lista"
						Integer numeroLista = Integer.parseInt(tokenizer
								.nextToken(":").trim());
						Lista lista = listas.get(numeroLista);
						Candidato candidato = new Candidato(etapaActual, lista);
						etapaActual.addLista(lista);
						int cantCandidatos = Integer.parseInt(tokenizer
								.nextToken().trim());
						for (int c = 0; c < cantCandidatos; c++) {
							candidato.addCandidato(parser.nextLine());
						}
						etapaActual.addCandidato(candidato);
					}
					etapaActual.addCandidatoBlanco();
				}
			}
		} catch (Exception e) {
			System.out
					.println("ERROR : Esta mal el formato del archivo de Candidatos.");
		} finally {
			parser.close();
		}
	}

}
